#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
#include "sieve.h"
#include "util.h"
 

#define nMax 4
#define iterazioni 1000

int main (){
	
	int numeroMassimo;
	int i,z;
	
	/*declare variables */
	struct timeval tv_start;
	struct timeval tv_end;
	int j;
	
	//matrice che conterrà i tempi campionati
	unsigned long tempi[nMax][iterazioni];


	FILE *fp;
	if ((fp=fopen("dati.csv","a")) != NULL){
		printf("Memorizzo valori in file...\n");
		fprintf(fp,"%s,%s,%s,%s\n", "Iterazioni", "IterazioneAttuale", "Numero Elementi", "Tempo Esecuzione (us)");
	}else printf("Errore durante la scrittura su file\n");
	fclose(fp);

	for (j=0; j<iterazioni; j++){
		
		numeroMassimo = 10;

		for (i=0; i< nMax; i++){

			printf("i:%d j: %d\n", i, j);

			numeroMassimo = numeroMassimo * 10;
			int numeriPrimi = 0;

			//
			// Ciclo sul numero di iterazione perche' la misura sia effettuata sulla media e
			// non sul singolo valore
			//

			/*get the first time stamp*/
			gettimeofday(&tv_start, NULL);

			numeriPrimi = sieve(numeroMassimo);

			/*get the second time stamp*/
			gettimeofday(&tv_end, NULL);

			/*print the time stamps*/
			printf("Alla %d iterazione i numeri primi minori di %d sono: %d\n", j, numeroMassimo, numeriPrimi);
			printf("Iterazione %d di %d numeri time: %ld.%06ld, %ld.%06ld\n",j, numeroMassimo, (long int) tv_start.tv_sec, (long int)tv_start.tv_usec, (long int) tv_end.tv_sec, (long int) tv_end.tv_usec);
			tempi[i][j] = diff(tv_end,tv_start);
			printf("Differenza e': %lu microsecondi\n", tempi[i][j]);
			printf("Tempo memorizzato posizione %d-%d e': %lu microsecondi\n\n", i, j, tempi[i][j]);

			salva_valori_in_CSV(numeroMassimo, j, iterazioni, tempi[i][j]);
		}
	}

	for (z = 0; z<nMax; z++){
		double valore_media =  media(tempi[z],iterazioni);
		printf("Valore media %d: %f\n", z, valore_media);
	}

	return 0;
}


